/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package DTD.Validador;

import DTD.Diccionario.Diccionario;
import Utilidades.StrOp;
import Utilidades.VerificadorStrings;
import java.util.ArrayList;

/**
 * Clase que valida los atributos de la etiqueta
 * @author Administrador
 */
public class ValidadorSintaxisAttList implements IValidadorSintaxis{

    private Diccionario diccionario;//diccionario de palabras reservadas
    private ValidadorSintaxisAtributo validadorAtributo;

    /**
     * Constructor
     */
    public ValidadorSintaxisAttList() {
        diccionario = new Diccionario();
        validadorAtributo = new ValidadorSintaxisAtributo();
    }
    
    /**
     * Valida si la cadena recibida por parametro hace referencia a la sintaxis
     * de los atributos de una etiqueta del archivo XML
     * @param aValidar String a validar
     * @return true si corresponde a la sintaxis de los atributos de una etiqueta, false en caso contrario
     */
    public boolean validar(String aValidar) {
        boolean resultado = true;

        if (VerificadorStrings.estaVacia(aValidar, "<!ATTLIST", ">") == true) {
            resultado = false;
        }
        else if (VerificadorStrings.esInicioFin(aValidar, "<!ATTLIST", ">") == false) {
            resultado = false;
        }
        else if (VerificadorStrings.tieneMasDe(aValidar, "><", 1, true) == true) {
            resultado = false;
        }
        else if (validarNombre(aValidar) == false) {
            resultado = false;
        }
        else if (validarSintaxis(aValidar) == false) {
            resultado = false;
        }
        return resultado;
    }

    private boolean validarNombre(String aValidar) {
        boolean resultado = true;
        String nombre = StrOp.separar(aValidar, " ", "<!ATTLIST", ">", '(', ')')[0];

        if (VerificadorStrings.soloTextosYGuiones(nombre) == false) {
            resultado = false;
        }
        if (diccionario.existe(nombre) == true) {
            resultado = false;
        }
        return resultado;
    }

    private boolean validarSintaxis(String aValidar) {
        boolean resultado = true;
        String[] lista = getDefiniciones(aValidar);

        if (lista == null || lista.length == 0) {
            resultado = false;
        }
        else if (this.validadorAtributo.validar(lista) == false) {
            resultado = false;
        }
        return resultado;
    }

    private String[] getDefiniciones(String str) {
        ArrayList<String> resultado = new ArrayList<String>();
        String[] lista = StrOp.separar(str, " ", "<!ATTLIST", ">", '(', ')');
        int j = 0;
        String agregar = "";

        for (int i = 1; i < lista.length; i++) {
            String aux = lista[i];
            if (j == 3) {
                if (diccionario.existe(aux)) {
                    agregar = agregar + aux + " ";
                }
                else {
                    i--;
                }
                resultado.add(agregar.trim());
                agregar = "";
                j = 0;
            }
            else {
                agregar = agregar + aux + " ";
                j++;
            }
        }

        if (agregar.equals("") == false) {
            resultado.add(agregar.trim());
        }
        return resultado.toArray(new String[resultado.size()]);
    }
}
